#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int MAX_N = 10000;
vector<int > G[MAX_N];
stack<int> S;
int dfn[MAX_N],low[MAX_N],time,mark[MAX_N];
bool visited[MAX_N];
void dfs(int V);
int main()
{
	int N,M;
	cin>>N>>M;
	for(int i=0; i<M; i++)
	{
		int temp1,temp2;
		cin>>temp1>>temp2;
		G[temp1].push_back(temp2);
	}
	
	for(int i=1; i<=N; i++)
	{
		if(!dfn[i])	dfs(i);
	}
	for(int i=0; i<20; i++)
	{
		cout<<i<<":"<<mark[i]<<endl;
	}
}
void dfs(int V)
{
	time++;
	dfn[V]=time;
	low[V]=time;
	visited[V]=true;
	S.push(V);
	for(int i=0; i<G[V].size(); i++)
	{
		int K=G[V][i];
		if(!dfn[K])
		{
			cout<<V<<"->"<<K<<endl;
			dfs(K);
			low[V]=min(low[V],low[K]);
		}
		else if(visited[K])		low[V]=min(low[V],dfn[K]);
		//请注意这里用dfn而非low，是为了防止找到不相干的叔叔节点。
	}
	if(dfn[V]==low[V])
	{
		int U;
		do
		{
			U=S.top();
			visited[U]=false;
			mark[U]=V;
			S.pop();
		}
		while(V!=U);
	}
}